package com.bzkj.common.utils;

import com.bzkj.common.constant.HttpStatus;
import com.bzkj.common.constant.NccStatusConstant;
import com.bzkj.common.core.page.TableDataInfo;
import com.bzkj.common.domain.NccApiResponse;
import com.bzkj.common.exception.NccBusinessException;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @ClassName DataProcessCommonUtils
 * @Description TODO
 * @Author C1309
 * @Date 2025/5/12 13:41
 */
public class DataProcessCommonUtils {
    /**
     * 封装分页数据
     *
     * @param rows  数据
     * @param total 总数据
     * @return TableDataInfo
     */
    public static TableDataInfo getTableInfo(List<?> rows, long total) {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(rows);
        rspData.setTotal(total);
        return rspData;
    }

    /**
     * 封装分页数据
     *
     * @param rows     数据
     * @param pageNum  当前页码
     * @param pageSize 每页大小
     * @return TableDataInfo
     */
    public static TableDataInfo getTableInfo(List<?> rows, int pageNum, int pageSize) {
        // 获取分页结果
        int total = rows.size();
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(pageNum * pageSize, total);
        if (startIndex > endIndex) {
            startIndex = Math.max(endIndex - pageSize, 0);
        }
        List<?> pagedList = rows.subList(startIndex, endIndex);
        return getTableInfo(pagedList, total);
    }

    /*================================================== 分割线 ==================================================*/

    /**
     * 获取当前日期
     *
     * @return 当前日期字符串
     */
    public static String getLocalDate() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(new Date());
    }

    /*================================================== 分割线 ==================================================*/

    /**
     * 验证 NCC 响应状态
     *
     * @param nccApiResponse NCC 返回结果
     */
    public static void validateNccResponse(NccApiResponse nccApiResponse) {
        String responseCode = nccApiResponse.getCode();
        String message = nccApiResponse.getMessage();

        if (NccStatusConstant.SUCCESS_CODE.equals(responseCode)) {
            return; // 成功，无需处理
        }

        if (NccStatusConstant.BUSINESS_ERROR_CODE.equals(responseCode)) {
            String errorStack = nccApiResponse.getErrorStack();

            // 提取首条业务异常信息
            String extractedError = extractFirstBusinessException(errorStack);
            throw new NccBusinessException(extractedError);
        }

        if (NccStatusConstant.REFERENCE_ERROR_CODE.equals(responseCode)) {
            throw new NccBusinessException("错误信息：" + message);
        }

        if (Objects.equals(responseCode, "") && Objects.equals(message, "请求未授权")) {
            throw new NccBusinessException("请检查NCC是否重启或尝试联系NCC技术支持进行处理哦~");
        }
        // 处理其他未知错误
        throw new NccBusinessException("未知错误：" + nccApiResponse);
    }

    /**
     * 提取errorStack中的首条业务异常信息
     *
     * @param errorStack 完整的堆栈信息
     * @return 首条业务异常信息
     */
    public static String extractFirstBusinessException(String errorStack) {
        if (errorStack == null || errorStack.isEmpty()) {
            return "No error stack available";
        }

        // 修改点1：通用化匹配所有xxxxxException格式的异常类名
        Pattern pattern = Pattern.compile(
                "([a-zA-Z0-9_.]+Exception):\\s*(.*?)(?=\\s+at|\\n|$)",  // 包含包名的异常类匹配
                Pattern.DOTALL
        );

        Matcher matcher = pattern.matcher(errorStack);

        if (matcher.find()) {
            String className = matcher.group(1).trim();
            String message = matcher.group(2).trim();

            // 修改点2：增强空白字符处理
            String cleanMessage = message
                    .replaceAll("[\\r\\n\\t]+", " ")    // 处理换行和制表
                    .replaceAll("\\s{2,}", " ")         // 合并连续空格
                    .trim();

            StringBuilder sb = new StringBuilder();
            sb.append("异常信息：").append(className);
            if (!cleanMessage.isEmpty()) {
                sb.append("</br>错误信息：").append(cleanMessage);
            }
            return sb.toString();
        }
        return "No Exception found";
    }

    /**
     * 封装分页数据
     *
     * @param rows  数据
     * @param total 总数据
     * @return TableDataInfo
     */
    public static TableDataInfo getTableInfo(List<?> rows, long total,Double num1,Double num2) {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(rows);
        rspData.setTotal(total);
        rspData.setTotalNum1(num1);
        rspData.setTotalNum2(num2);
        return rspData;
    }

    /**
     * 封装分页数据
     *
     * @param rows     数据
     * @param pageNum  当前页码
     * @param pageSize 每页大小
     * @return TableDataInfo
     */
    public static TableDataInfo getTableInfo(List<?> rows, Double num1,Double num2,int pageNum, int pageSize) {
        // 获取分页结果
        int total = rows.size();
        int startIndex = (pageNum - 1) * pageSize;
        int endIndex = Math.min(pageNum * pageSize, total);
        if (startIndex > endIndex) {
            startIndex = Math.max(endIndex - pageSize, 0);
        }
        List<?> pagedList = rows.subList(startIndex, endIndex);
        return getTableInfo(pagedList, total,num1,num2);
    }
}
